透過 Git Hook 讓我們在 Chink-in 程式碼( git push
)前、或是在 Local 提交變動(git commit
)前,先執行 dotnet test
以確保程式碼是沒有錯誤的。
在前幾天,我們大致暸解如何透過 .NET Core CLI 進行一些以往習慣透過 IDE 進行的操作。而在講述使用 CI/CD 工具前,或許我們可以在 Local 進行持續整合的第一步,那就是透過 Git Hook 去做一些檢測,以確保每一次 Commit 或每一次 Push 都有一定的品質保證。
本篇不會在 Git Hook 做太多詳細的介紹,這部分我打算在隔壁棚《Git 其然,Git 其所然》講述。所以只會針對方法做快速的程式碼示例:
所有 Git Hook 的腳本,都會存在該專案根目錄下的 .git/hooks
目錄中。在通常情況下,裡面會已經有許多範例腳本,並且以 .sample
做為結尾。而當我們把 .sample
去掉時,該檔案就會成為如其名的一個 Git Hook,在做對應的 Git 操作時,順便執行腳本裡面所寫的指令。
在本篇我們會用到的 Git Hook 會是:
pre-commit
:在進行 commit 前,執行此腳本。pre-push
:在將程式碼 Push 到 Remote Repository 前,執行此腳本。假設今天的情境是,在進行 commit 前,必須通過測試,那就在 .git/hooks/
底下新增一個 pre-commit
檔案,內容為:
#!/bin/sh
# Execute testing without output
dotnet test > /dev/null 2>&1
# Restore result (retuen code) of testing
rc=$?
if [ $rc -ne 0 ] ; then
echo "You should pass the testing before action"
echo ""
exit $rc
fi
為了測試這個腳本是否能成功運行,我們將測試專案的 Test1()
方法強制失敗:
using Xunit;
namespace WebProj.Tests
{
public class UnitTest1
{
[Fact]
public void Test1()
{
Assert.True(false);
}
}
}
先執行一次 dotnet test
確認測試必定失敗:
$ dotnet test
Test run for /Users/ironman/dotnet-sln/WebProj.Tests/bin/Debug/netcoreapp2.2/WebProj.Tests.dll(.NETCoreApp,Version=v2.2)
Microsoft (R) Test Execution Command Line Tool Version 16.2.0-preview-20190606-02
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
[xUnit.net 00:00:00.50] WebProj.Tests.UnitTest1.Test1 [FAIL]
X WebProj.Tests.UnitTest1.Test1 [5ms]
Error Message:
Assert.True() Failure
Expected: True
Actual: False
Stack Trace:
at WebProj.Tests.UnitTest1.Test1() in /Users/ironman/dotnet-sln/WebProj.Tests/UnitTest1.cs:line 10
Test Run Failed.
Total tests: 1
Failed: 1
Total time: 1.2550 Seconds
接著嘗試進行 commit:
$ git commit
You should pass the testing before action
此篇只是初稿,會在這 30 天進行進一步的修改,預計